package thread;
/**
 * 互斥锁
 * 当使用多个synchronized锁定多个代码片段时，这些synchronized指定的同步监视器对象
 * 是同一个时，那么这些代码片段就是互斥的，多个线程不能同时执行写几个代码片段。
 * @author 范传奇
 *
 */
public class SyncDemo4 {
	public static void main(String[] args) {
//		Foo f1 = new Foo();
//		Foo f2 = new Foo();
		Foo foo = new Foo();
		Thread t1 = new Thread() {
			public void run() {
//				f1.methodA();//与下面线程的f2.methodB没有互斥，锁对象不同
				foo.methodA();
			}
		};
		Thread t2 = new Thread() {
			public void run() {
//				f2.methodB();
				foo.methodB();
			}
		};
		t1.start();
		t2.start();
	}
}

class Foo{
	public void methodA() {
		/*
		 * 这样写仍然与下面的methodB方法有互斥效果，因为这里指定的同步监视器对象
		 * 是this，也就是methodA方法所属对象，而methodB上直接写synchronized时
		 * 指定的也是this。
		 * 那么此时两个线程分别调用同一个Foo对象的methodA和methodB方法时就是互斥的。
		 */
		synchronized (this) {
			try {
				Thread t = Thread.currentThread();
				System.out.println(t.getName()+":正在执行A方法...");
				Thread.sleep(5000);
				System.out.println(t.getName()+":执行A方法完毕!");
			} catch (Exception e) {
			}
		}		
	}
	public synchronized void methodB() {
		try {
			Thread t = Thread.currentThread();
			System.out.println(t.getName()+":正在执行B方法...");
			Thread.sleep(5000);
			System.out.println(t.getName()+":执行B方法完毕!");
		} catch (Exception e) {
		}
	}
}









